ã³ã³ããŠã³ãã³ã³ããŒãã³ããã¿ãŒã³ã䜿ããæè»ã§åå©çšæ§ã®é«ãReactã³ã³ããŒãã³ãAPIãæ§ç¯ããæ¹æ³ã解説ããã®å©ç¹ãå®è£ ãã¯ããã¯ãé«åºŠãªãŠãŒã¹ã±ãŒã¹ãŸã§æ¢ããŸãã
Reactã³ã³ããŠã³ãã³ã³ããŒãã³ãïŒæè»ã§åå©çšå¯èœãªã³ã³ããŒãã³ãAPIã®äœæ
çµ¶ãéãªãé²åããããã³ããšã³ãéçºã®äžçã«ãããŠãåå©çšå¯èœã§ä¿å®æ§ã®é«ãã³ã³ããŒãã³ããäœæããããšã¯æãéèŠã§ããã³ã³ããŒãã³ãããŒã¹ã®ã¢ãŒããã¯ãã£ãæã€Reactã¯ããããéæããããã®ããã€ãã®ãã¿ãŒã³ãæäŸããŠããŸãããã®äžã§ãç¹ã«åŒ·åãªãã¿ãŒã³ãã³ã³ããŠã³ãã³ã³ããŒãã³ãã§ããããã«ãããè€éãªå®è£ è©³çŽ°ãæœè±¡åãã€ã€ãå©çšè ã«ãã现ããå¶åŸ¡ãäžãããæè»ã§å®£èšçãªã³ã³ããŒãã³ãAPIãæ§ç¯ã§ããŸãã
ã³ã³ããŠã³ãã³ã³ããŒãã³ããšã¯ïŒ
ã³ã³ããŠã³ãã³ã³ããŒãã³ããšã¯ãåã³ã³ããŒãã³ãã®ç¶æ ãšããžãã¯ã管çãããããã®éã§æé»çãªå調ãæäŸããã³ã³ããŒãã³ãã§ããè€æ°ã®éå±€ãéããŠpropsãæž¡ã代ããã«ã芪ã³ã³ããŒãã³ããã³ã³ããã¹ããå ±æãããç¶æ ãå ¬éããåã³ã³ããŒãã³ããããã«çŽæ¥ã¢ã¯ã»ã¹ããŠå¯Ÿè©±ã§ããããã«ããŸããããã«ããããã宣èšçã§çŽæçãªAPIãå¯èœã«ãªããå©çšè ã¯ã³ã³ããŒãã³ãã®æ¯ãèããå€èгããã詳现ã«å¶åŸ¡ã§ããŸãã
ã¬ãŽãããã¯ã®ã»ãããæ³åããŠã¿ãŠãã ãããåãããã¯ïŒåã³ã³ããŒãã³ãïŒã¯ç¹å®ã®æ©èœãæã¡ãŸãããããããã¹ãŠãæ¥ç¶ããŠãã倧ããªæ§é ïŒã³ã³ããŠã³ãã³ã³ããŒãã³ãïŒãäœãäžããŸãããåæ±èª¬ææžãïŒã³ã³ããã¹ãïŒããåãããã¯ãä»ã®ãããã¯ãšã©ã®ããã«çžäºäœçšããããæç€ºããŸãã
ã³ã³ããŠã³ãã³ã³ããŒãã³ãã䜿çšããã¡ãªãã
- æè»æ§ã®åäžïŒ å©çšè ã¯ãåºç€ãšãªãå®è£ ã倿Žããããšãªããã³ã³ããŒãã³ãã®åã ã®éšåã®æ¯ãèããå€èгãã«ã¹ã¿ãã€ãºã§ããŸããããã«ãããããŸããŸãªã³ã³ããã¹ãã§ã®é©å¿æ§ãšåå©çšæ§ãåäžããŸãã
- åå©çšæ§ã®æ¹åïŒ é¢å¿äºãåé¢ããæç¢ºãªAPIãæäŸããããšã§ãã³ã³ããŠã³ãã³ã³ããŒãã³ãã¯ã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåããè€æ°ã®ãããžã§ã¯ãéã§ãããç°¡åã«åå©çšã§ããŸãã
- 宣èšçãªæ§æïŒ ã³ã³ããŠã³ãã³ã³ããŒãã³ãã¯ãå©çšè ãã©ã®ããã«éæãããã§ã¯ãªããäœãéæãããããèšè¿°ããããã宣èšçãªããã°ã©ãã³ã°ã¹ã¿ã€ã«ãä¿é²ããŸãã
- Prop Drillingã®åæžïŒ ãã¹ããããã³ã³ããŒãã³ãã®è€æ°ã®å±€ãéããŠpropsãæž¡ããšããé¢åãªããã»ã¹ãåé¿ã§ããŸããã³ã³ããã¹ãã¯ãå ±æç¶æ ã«ã¢ã¯ã»ã¹ãæŽæ°ããããã®äžå€®éæš©çãªå ŽæãæäŸããŸãã
- ä¿å®æ§ã®åäžïŒ é¢å¿äºã®æç¢ºãªåé¢ã«ãããã³ãŒãã®çè§£ãä¿®æ£ããããã°ã容æã«ãªããŸãã
ä»çµã¿ãçè§£ããïŒã³ã³ããã¹ããšã³ã³ããžã·ã§ã³
ã³ã³ããŠã³ãã³ã³ããŒãã³ãã®ãã¿ãŒã³ã¯ã2ã€ã®äžå¿çãªReactã®æŠå¿µã«å€§ããäŸåããŠããŸãã
- ã³ã³ããã¹ãïŒ ã³ã³ããã¹ãã¯ãpropsãåã¬ãã«ã§æåã§æž¡ãããšãªããã³ã³ããŒãã³ãããªãŒãéããŠããŒã¿ãæž¡ãæ¹æ³ãæäŸããŸããããã«ãããåã³ã³ããŒãã³ãã¯èŠªã³ã³ããŒãã³ãã®ç¶æ ã«ã¢ã¯ã»ã¹ããæŽæ°ããããšãã§ããŸãã
- ã³ã³ããžã·ã§ã³ïŒåæïŒïŒ Reactã®åæã¢ãã«ã«ãããããå°ããç¬ç«ããã³ã³ããŒãã³ããçµã¿åãããŠè€éãªUIãæ§ç¯ã§ããŸããã³ã³ããŠã³ãã³ã³ããŒãã³ãã¯ããã®åæã掻çšããŠããŸãšãŸãã®ããæè»ãªAPIãäœæããŸãã
ã³ã³ããŠã³ãã³ã³ããŒãã³ãã®å®è£ ïŒå®è·µäŸ - ã¿ãã³ã³ããŒãã³ã
ã³ã³ããŠã³ãã³ã³ããŒãã³ãã®ãã¿ãŒã³ããå®è·µçãªäŸã§ããã¿ãã³ã³ããŒãã³ãã§èª¬æããŸããããã¢ã¯ãã£ããªã¿ãã管çãããã®åã³ã³ããŒãã³ãïŒ`TabList`ã`Tab`ã`TabPanel`ïŒã«ã³ã³ããã¹ããæäŸãã`Tabs`ã³ã³ããŒãã³ããäœæããŸãã
1. `Tabs`ã³ã³ããŒãã³ãïŒèŠªïŒ
ãã®ã³ã³ããŒãã³ãã¯ã¢ã¯ãã£ããªã¿ãã®ã€ã³ããã¯ã¹ã管çããã³ã³ããã¹ããæäŸããŸãã
```javascript import React, { createContext, useState, useContext } from 'react'; const TabsContext = createContext(null); function Tabs({ children, defaultIndex = 0 }) { const [activeIndex, setActiveIndex] = useState(defaultIndex); const value = { activeIndex, setActiveIndex, }; return (2. `TabList`ã³ã³ããŒãã³ã
ãã®ã³ã³ããŒãã³ãã¯ã¿ãããããŒã®ãªã¹ããæç»ããŸãã
```javascript function TabList({ children }) { return (3. `Tab`ã³ã³ããŒãã³ã
ãã®ã³ã³ããŒãã³ãã¯åäžã®ã¿ãããããŒãæç»ããŸããã³ã³ããã¹ãã䜿çšããŠã¢ã¯ãã£ããªã¿ãã®ã€ã³ããã¯ã¹ã«ã¢ã¯ã»ã¹ããã¯ãªãã¯ããããšãã«ãããæŽæ°ããŸãã
```javascript function Tab({ children, index }) { const { activeIndex, setActiveIndex } = useContext(TabsContext); const isActive = activeIndex === index; return ( ); } export { Tab }; ```4. `TabPanel`ã³ã³ããŒãã³ã
ãã®ã³ã³ããŒãã³ãã¯åäžã®ã¿ãã®ã³ã³ãã³ããæç»ããŸããã¿ããã¢ã¯ãã£ããªå Žåã«ã®ã¿æç»ãããŸãã
```javascript function TabPanel({ children, index }) { const { activeIndex } = useContext(TabsContext); const isActive = activeIndex === index; return isActive ?5. 䜿çšäŸ
ã¢ããªã±ãŒã·ã§ã³ã§`Tabs`ã³ã³ããŒãã³ãã䜿çšããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
```javascript import Tabs, { TabList, Tab, TabPanel } from './Tabs'; function App() { return (ã¿ã 1ã®ã³ã³ãã³ã
ã¿ã 2ã®ã³ã³ãã³ã
ã¿ã 3ã®ã³ã³ãã³ã
ãã®äŸã§ã¯ã`Tabs`ã³ã³ããŒãã³ããã¢ã¯ãã£ããªã¿ãã管çããŠããŸãã`TabList`ã`Tab`ãããã³`TabPanel`ã³ã³ããŒãã³ãã¯ã`Tabs`ãæäŸããã³ã³ããã¹ããã`activeIndex`ãš`setActiveIndex`ã®å€ã«ã¢ã¯ã»ã¹ããŸããããã«ãããå©çšè ãåºç€ãšãªãå®è£ ã®è©³çްãå¿é ããããšãªããã¿ãã®æ§é ãšã³ã³ãã³ããç°¡åã«å®çŸ©ã§ããããŸãšãŸãã®ããæè»ãªAPIãäœæãããŸãã
é«åºŠãªãŠãŒã¹ã±ãŒã¹ãšèæ ®äºé
- å¶åŸ¡ã³ã³ããŒãã³ã vs. éå¶åŸ¡ã³ã³ããŒãã³ãïŒ ã³ã³ããŠã³ãã³ã³ããŒãã³ããå¶åŸ¡ã³ã³ããŒãã³ãïŒèŠªã³ã³ããŒãã³ããç¶æ ãå®å šã«å¶åŸ¡ããïŒã«ããããéå¶åŸ¡ã³ã³ããŒãã³ãïŒåã³ã³ããŒãã³ããèªèº«ã®ç¶æ ã管çã§ãã芪ã¯ããã©ã«ãå€ãã³ãŒã«ããã¯ãæäŸããïŒã«ããããéžæã§ããŸããã¿ãã³ã³ããŒãã³ãã®äŸã¯ãTabsã³ã³ããŒãã³ãã«`activeIndex`ããããã£ãš`onChange`ã³ãŒã«ããã¯ãæäŸããããšã§å¶åŸ¡ã³ã³ããŒãã³ãã«ã§ããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒARIAïŒïŒ ã³ã³ããŠã³ãã³ã³ããŒãã³ããæ§ç¯ããéã«ã¯ãã¢ã¯ã»ã·ããªãã£ãèæ ®ããããšãäžå¯æ¬ ã§ããARIA屿§ã䜿çšããŠãã¹ã¯ãªãŒã³ãªãŒããŒããã®ä»ã®æ¯æŽæè¡ã«æå³çãªæ å ±ãæäŸããŸããããšãã°ãã¿ãã³ã³ããŒãã³ãã§ã¯ã`role="tablist"`ã`role="tab"`ã`aria-selected="true"`ãããã³`role="tabpanel"`ã䜿çšããŠã¢ã¯ã»ã·ããªãã£ã確ä¿ããŸãã
- åœéåïŒi18nïŒãšå°ååïŒl10nïŒïŒ ã³ã³ããŠã³ãã³ã³ããŒãã³ããç°ãªãèšèªãæåçèæ¯ããµããŒãããããã«èšèšãããŠããããšã確èªããŠãã ãããé©åãªi18nã©ã€ãã©ãªã䜿çšããå³ããå·ŠïŒRTLïŒã¬ã€ã¢ãŠããèæ ®ããŸãã
- ããŒããšã¹ã¿ã€ãªã³ã°ïŒ CSS倿°ãStyled ComponentsãEmotionã®ãããªã¹ã¿ã€ãªã³ã°ã©ã€ãã©ãªã䜿çšããŠãå©çšè ãã³ã³ããŒãã³ãã®å€èгãç°¡åã«ã«ã¹ã¿ãã€ãºã§ããããã«ããŸãã
- ã¢ãã¡ãŒã·ã§ã³ãšãã©ã³ãžã·ã§ã³ïŒ ã¢ãã¡ãŒã·ã§ã³ãšãã©ã³ãžã·ã§ã³ã远å ããŠããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããŸããReact Transition Groupã¯ãç°ãªãç¶æ éã®ãã©ã³ãžã·ã§ã³ã管çããã®ã«åœ¹ç«ã¡ãŸãã
- ãšã©ãŒãã³ããªã³ã°ïŒ äºæããªãç¶æ³ãé©åã«åŠçããããã«ãå ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŸãã`try...catch`ãããã¯ã䜿çšããæçãªãšã©ãŒã¡ãã»ãŒãžãæäŸããŸãã
é¿ããã¹ãèœãšã穎
- éå°ãªèšèšïŒ Prop Drillingã倧ããªåé¡ã§ã¯ãªãåçŽãªãŠãŒã¹ã±ãŒã¹ã«ã³ã³ããŠã³ãã³ã³ããŒãã³ãã䜿çšããªãã§ãã ãããã·ã³ãã«ã«ä¿ã¡ãŸãããïŒ
- å¯çµåïŒ åã³ã³ããŒãã³ãéã«å¯çµåãããäŸåé¢ä¿ãäœæããããšã¯é¿ããŠãã ãããæè»æ§ãšä¿å®æ§ã®ãã©ã³ã¹ãç®æããŸãããã
- è€éãªã³ã³ããã¹ãïŒ ããŸãã«ãå€ãã®å€ãæã€ã³ã³ããã¹ããäœæããããšã¯é¿ããŠãã ãããããã«ãããã³ã³ããŒãã³ãã®çè§£ãšä¿å®ãå°é£ã«ãªãå¯èœæ§ããããŸããããå°ãããçŠç¹ã®çµãããã³ã³ããã¹ãã«åå²ããããšãæ€èšããŠãã ããã
- ããã©ãŒãã³ã¹ã®åé¡ïŒ ã³ã³ããã¹ãã䜿çšããéã«ã¯ããã©ãŒãã³ã¹ã«æ³šæããŠãã ãããã³ã³ããã¹ããžã®é »ç¹ãªæŽæ°ã¯ãåã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ãåŒãèµ·ããå¯èœæ§ããããŸãã`React.memo`ã`useMemo`ã®ãããªã¡ã¢åæè¡ã䜿çšããŠããã©ãŒãã³ã¹ãæé©åããŠãã ããã
ã³ã³ããŠã³ãã³ã³ããŒãã³ãã®ä»£æ¿æ¡
ã³ã³ããŠã³ãã³ã³ããŒãã³ãã¯åŒ·åãªãã¿ãŒã³ã§ãããåžžã«æåã®è§£æ±ºçãšã¯éããŸããã以äžã«æ€èšãã¹ãããã€ãã®ä»£æ¿æ¡ã瀺ããŸãã
- Render PropsïŒ Render Propsã¯ãå€ã颿°ã§ããpropã䜿çšããŠReactã³ã³ããŒãã³ãéã§ã³ãŒããå ±æããæ¹æ³ãæäŸããŸãããããã¯ãå©çšè ãã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ãã«ã¹ã¿ãã€ãºã§ããç¹ã§ã³ã³ããŠã³ãã³ã³ããŒãã³ãã«äŒŒãŠããŸãã
- é«éã³ã³ããŒãã³ãïŒHOCsïŒïŒ HOCã¯ãã³ã³ããŒãã³ããåŒæ°ãšããŠåãåããæ°ãã匷åãããã³ã³ããŒãã³ããè¿ã颿°ã§ããã³ã³ããŒãã³ãã«æ©èœã远å ããããåäœã倿Žãããããããã«äœ¿çšã§ããŸãã
- React HooksïŒ Hooksã䜿çšãããšã颿°ã³ã³ããŒãã³ãã§ç¶æ ããã®ä»ã®Reactã®æ©èœã䜿çšã§ããŸããããžãã¯ãæœåºããã³ã³ããŒãã³ãéã§å ±æããããã«äœ¿çšã§ããŸãã
çµè«
ã³ã³ããŠã³ãã³ã³ããŒãã³ãã®ãã¿ãŒã³ã¯ãReactã§æè»ã§åå©çšå¯èœããã€å®£èšçãªã³ã³ããŒãã³ãAPIãæ§ç¯ããããã®åŒ·åãªæ¹æ³ãæäŸããŸããã³ã³ããã¹ããšã³ã³ããžã·ã§ã³ã掻çšããããšã§ãè€éãªå®è£ è©³çŽ°ãæœè±¡åãã€ã€ãå©çšè ã«ãã现ããå¶åŸ¡ãäžããã³ã³ããŒãã³ããäœæã§ããŸãããã ãããã®ãã¿ãŒã³ãå®è£ ããåã«ããã¬ãŒããªããšæœåšçãªèœãšãç©Žãæ éã«æ€èšããããšãäžå¯æ¬ ã§ããã³ã³ããŠã³ãã³ã³ããŒãã³ãã®èåŸã«ããååãçè§£ããè³¢æã«é©çšããããšã§ãããä¿å®æ§ãé«ãã¹ã±ãŒã©ãã«ãªReactã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããäžçäžã®ãã¹ãŠã®ãŠãŒã¶ãŒã«çŽ æŽãããäœéšãæäŸããããã«ãã³ã³ããŒãã³ããæ§ç¯ããéã«ã¯åžžã«ã¢ã¯ã»ã·ããªãã£ãåœéåãããã©ãŒãã³ã¹ãåªå ããããšãå¿ããªãã§ãã ããã
ãã®ãå æ¬çãªãã¬ã€ãã¯ã仿¥ããæè»ã§åå©çšå¯èœãªã³ã³ããŒãã³ãAPIã®æ§ç¯ãå§ããããã«ãReactã³ã³ããŠã³ãã³ã³ããŒãã³ãã«ã€ããŠç¥ã£ãŠããã¹ããã¹ãŠãç¶²çŸ ããŸããã